Список Задач + Dependency Inversion Principle
➡️Ссылка на репозиторий с кодом этого урока
Внедряем зависимость черезmain.dart
Cоздаём экземпляр SharedPreferencesService и "внедряем" его в ToDoViewModel.
Файл main.dart
import 'package:flutter/material.dart';
import 'package:flutter_localstorage/services/shared_preferences_service.dart';
import 'package:provider/provider.dart';
import 'viewmodels/todo_viewmodel.dart';
import 'views/todo_screen.dart';
void main() {
runApp(
// Оборачиваем приложение в ChangeNotifierProvider
// Создаём экземпляр ViewModel и передаём вниз по дереву
ChangeNotifierProvider(
create: (context) => ToDoViewModel(
// 👉 СОЗДАЕМ и ВНЕДРЯЕМ зависимость здесь
storageService: SharedPreferencesService(),
),
child: const ToDoApp(),
),
);
}
class ToDoApp extends StatelessWidget {
const ToDoApp({super.key});
@override
Widget build(BuildContext context) {
// Используем Consumer
// MaterialApp будет перестраиваться при смене цветовой темы
return Consumer<ToDoViewModel>(
builder: (context, viewModel, child) {
return MaterialApp(
title: "Список Дел",
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.cyan),
brightness: Brightness.light,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),
// Используем ViewModel для управления состоянием темы
// В зависимости от isDarkMode, выбираем тёмную или светлую тему
themeMode: viewModel.isDarkMode ? ThemeMode.dark : ThemeMode.light,
debugShowCheckedModeBanner: false,
home: const ToDoScreen(),
);
},
);
}
}
🔥🔥🔥 В итоге, если нужно будет перейти на использование другого сервиса для работы с локальным хранилищем (например sqlite), сделать это будет очень просто и гибко! В следующем разделе занятий это реализуем!
Демонстрация работы приложения
Приложение так же прекрасно работает!

.